Digital images are typically represented by an N-dimensional array of pixel color values or tuples. For example, a two-dimensional color image might be represented by a two-dimensional array of pixels, where each pixel is assigned a pixel color according to a red-green-blue (RGB) triple, and where each component of the triple is represented by a finite value. Other color spaces might be used, but generally an image is representable by each pixel having a pixel color selected from a color space. Examples of color spaces include RGB, CYMK (cyan-yellow-magenta-black) and sometimes include a transparency value, such as an alpha value.
For images where each pixel might have a value from 0 to 255 for a red component, 0 to 255 for a green component and 0 to 255 for a blue component, 24-bits are used to represent each pixel in an uncompressed image. Often, this is too much memory to be used per pixel and much of the resolution might not be used, such as where only a few colors are actually present in the image. Furthermore, when multiple images are part of a display and might have much in common, but different color patterns, storage is used for the multiple images, further requiring additional memory.
Palettes (or color lookup tables; “CLUTs”) are often used to reduce the per-pixel bit requirements. With a palette approach, the color value or tuple for each differently colored pixel is entered in a table. If the table is too large, some pixel values might be folded into others to reduce the table size (for some loss of image quality in many cases). Then, each pixel is represented by an index into the table rather than its pixel color tuple. Paletting allows for quick color substitution, as a change in an entry in the palette table causes all pixels of that color to change.
These techniques do not allow an image designer a full range of features. It would be desirable to overcome the shortcomings of the prior art described above.